package resource;

import java.lang.reflect.Method;
import java.util.Arrays;

//随机生成算法测试用例
public class SortTestHelper {
	public static Integer[] generateRandomArray(int n,int rangeL,int rangeR){
		Integer[] arr=new Integer[n];
		for(int i=0;i<n;i++){
			arr[i]=(int) (Math.random()*(rangeR-rangeL+1)+rangeL);//通过“+1”实现--前闭后闭[rangeL,rangeR]
		}
		return arr;
	}
	public void printArray(Object[] array){
		for(int i=0;i<array.length;i++){
			System.out.print(array[i]+" ");	
		}
	}
	
	/*public void testSort(String sortClassName,Comparable[] arry){
		try {
			Class sortClass=Class.forName(sortClassName);
			sortClass.getMethod("sort", arry.getClass());
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
		} catch (SecurityException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	}*/
	 public static void testSort(String sortClassName, Comparable[] arr){

	        // 通过Java的反射机制，通过排序的类名，运行排序函数
	        // * 依然是，使用反射机制并不是这个课程的重点, 大家也完全可以使用自己的方式书写代码, 最终只要能够测试出自己书写的算法的效率即可
	        // * 推荐大家阅读我在问答区向大家分享的一个学习心得: 【学习心得分享】请大家抓大放小，不要纠结于C++语言的语法细节
	        // * 链接: http://coding.imooc.com/learn/questiondetail/4100.html
	        try{
	            // 通过sortClassName获得排序函数的Class对象
	            Class sortClass = Class.forName(sortClassName);
	            // 通过排序函数的Class对象获得排序方法new Class[]{Comparable[].class}
	            Method sortMethod = sortClass.getMethod("sort",Comparable[].class);
	            // 排序参数只有一个，是可比较数组arr
	            Object[] params = new Object[]{arr};

	            long startTime = System.currentTimeMillis();
	            // 调用排序函数
	            sortMethod.invoke(null,params);
	            long endTime = System.currentTimeMillis();

	            if (!isSorted( arr )){
	            	System.out.println("排序出错");
	            }

	            System.out.println( sortClass.getSimpleName()+ " : " + (endTime-startTime) + "ms" );
	        }
	        catch(Exception e){
	            e.printStackTrace();
	        }
	    }
	// 判断arr数组是否有序
	 public static boolean isSorted(Comparable[] arr){

	        for( int i = 0 ; i < arr.length - 1 ; i ++ )
	            if( arr[i].compareTo(arr[i+1]) > 0 )
	                return false;
	        return true;
	    }
	 //返回一个近乎有序的数组
	public static Integer[] generateNearlyOrderedArray(int n,int swapTimes){
		Integer[] arry=new Integer[n];
		for(int i=0;i<n;i++){
			arry[i]=i;
		}
		for(int i=0;i<swapTimes;i++){
			int x=(int)(Math.random()*n);
			int y=(int)(Math.random()*n);
		//	System.out.println("//swapTimes:"+i+"	x:"+x+"	y:"+y);
			int t=arry[x];
			arry[x]=arry[y];
			arry[y]=t;
		}
		return arry;
	}
	public static void main(String[] args) {
		SortTestHelper helper=new SortTestHelper();
		/*Integer[] array=helper.generateRandomArray(50, 0, 50);
		helper.printArray(array);*/
		System.out.println(Arrays.toString(helper.generateNearlyOrderedArray(10, 2)));
	}
}
